package Hauptpaket;

import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamWriter;

public class Hauptklasse
{
    /**
     * @param args
     */
    public static void main (String [] args)
    {
    	try
    	{
	    	if(args.length > 0)
	    	{		    	
		    	List<String> argS = new ArrayList<String>();
		    	
		    	//Anfang
		    	//Erster Parameter muss entfernt werden, da Pfad und nicht Suchkriterium.
		    	for(String s : args)
		    	{
		    		argS.add(s);
		    	}
		    	
		    	argS.remove(0);
		    	//Ende
		    			    	
		    	getResults(args[0], Parser.ladeRegAusdruck(), Parser.ladeUnsortierterInhalt(args[1]));
	        }
    	}
    	catch(Exception ex)
    	{
    		System.out.println(ex.getMessage());
    	}
    }
    
	private static void getResults(String pfadErgebnis, List<RegAusdruck> regAusdruecke, List<UnsortierterInhalt> unsortierteInhalte)
    {
    	try
    	{    		
	    	XMLOutputFactory factory = XMLOutputFactory.newInstance();
	    	
			XMLStreamWriter writer = factory.createXMLStreamWriter( new FileOutputStream( pfadErgebnis ), "ISO-8859-1");
			
			// Der XML-Header wird erzeugt
			writer.writeStartDocument("ISO-8859-1", "1.0");
			// Zuerst wird das Wurzelelement mit Attribut geschrieben
			writer.writeStartElement( "results" );
			
			for(UnsortierterInhalt unsortierterInhalt : unsortierteInhalte)
			{
				RegAusdruck regAusdruck = null;
				
				for(RegAusdruck ra : regAusdruecke)
				{
					if(((List<MatchResult>)findMatches(ra.getUrl(), unsortierterInhalt.getLink())).size() > 0)
					{
						regAusdruck = ra;
						break;
					}
				}
				
				if(regAusdruck != null)
				{
					writer.writeStartElement("result");
					
					writer.writeStartElement("url");
					writer.writeCData(unsortierterInhalt.getLink());
					writer.writeEndElement();
					
					writer.writeStartElement("model");
					
					writer.writeCData(((List<MatchResult>)findMatches(regAusdruck.getModel(), unsortierterInhalt.getInhalt())).get(0).group().replaceAll(" $", ""));
					
					writer.writeEndElement();
					
					writer.writeStartElement("cpuhersteller");
					
					writer.writeCData(((List<MatchResult>)findMatches(regAusdruck.getCpuhersteller(), unsortierterInhalt.getInhalt())).get(0).group().replaceAll(" $", ""));
												
					writer.writeEndElement();
					
					writer.writeStartElement("prozessoren");
					
					for (MatchResult r : findMatches(regAusdruck.getProzessor(), unsortierterInhalt.getInhalt()))
			    	{
						writer.writeStartElement("prozessor");
						writer.writeCData(r.group().replaceAll(" $", ""));
						writer.writeEndElement();
			    	}
					
					writer.writeEndElement();
					
					writer.writeStartElement("osse");
					
					for (MatchResult r : findMatches(regAusdruck.getOs(), unsortierterInhalt.getInhalt()))
			    	{
						writer.writeStartElement("os");
						writer.writeCData(r.group().replaceAll(" $", ""));
						writer.writeEndElement();
			    	}
					
					writer.writeEndElement();
					
					writer.writeStartElement("ram");
					
					for (MatchResult r : findMatches(regAusdruck.getRam(), unsortierterInhalt.getInhalt()))
			    	{
						writer.writeStartElement("ram");
						writer.writeCData(r.group().replaceAll(" $", ""));
						writer.writeEndElement();
			    	}
					
					writer.writeEndElement();
					
					writer.writeStartElement("grafik");
					
					for (MatchResult r : findMatches(regAusdruck.getGrafik(), unsortierterInhalt.getInhalt()))
						writer.writeCData(r.group().replaceAll(" $", ""));
					
					writer.writeEndElement();
					
					writer.writeStartElement("hdds");
					
					for (MatchResult r : findMatches(regAusdruck.getHdd(), unsortierterInhalt.getInhalt()))
			    	{
						writer.writeStartElement("hdd");
						writer.writeCData(r.group().replaceAll(" $", ""));
						writer.writeEndElement();
			    	}
					
					writer.writeEndElement();
					
					writer.writeStartElement("groesse");
					
					for (MatchResult r : findMatches(regAusdruck.getGroesse(), unsortierterInhalt.getInhalt()))
						writer.writeCData(r.group().replaceAll(" $", ""));
					
					writer.writeEndElement();
					
					writer.writeStartElement("bildschirm");
					
					for (MatchResult r : findMatches(regAusdruck.getBildschirm(), unsortierterInhalt.getInhalt()))
						writer.writeCData(r.group().replaceAll(" $", ""));
					
					writer.writeEndElement();
					
					writer.writeEndElement();
				}
			}
	    	
	    	writer.writeEndElement();
			writer.writeEndDocument();
			writer.close();
    	}
    	catch(Exception ex)
    	{
    		ex.printStackTrace();
    	}
    }
	
	private static Iterable<MatchResult> findMatches( String pattern, CharSequence s ) 
    { 
      List<MatchResult> results = new ArrayList<MatchResult>(); 
     
      for ( Matcher m = Pattern.compile(pattern, Pattern.MULTILINE | Pattern.DOTALL).matcher(s); m.find(); ) 
        results.add( m.toMatchResult() ); 
     
      return results;
    }
}
